1.2.8 复制运算符
拼接运算符让我们能够将多个向量串联起来形成一个更大的向量。但有时你可能希望同一个向量重复多次串联,而像这样编写assign a = {b,b,b,b,b,b};
会显得相当繁琐。这时,复制运算符就派上用场了,它能够让你轻松地重复一个向量并将其串联起来:
{num{vector}}
这个表达式会将vector重复num次。其中,num必须是一个常量。这里的两组花括号都是必需的。
示例:
{5{1'b1}} // 结果为 5位的 11111(或者表示为5'd31或5'h1F)
{2{a,b,c}} // 效果等同于 `{a,b,c,a,b,c}`,即将 a, b, c 这三个向量重复了一次
{3'd5, {2{3'd6}}} // 结果为 9位的 101_110_110。这是将3'd5(即二进制的101)与第二个向量拼接起来,而第二个向量是由3'd6(即二进制的110)重复两次构成的。
实践练习:
复制运算符常见于一种场景,即当需要将一个小数值符号扩展到更大位宽,同时保持其原有符号值时。这是通过复制该小数值的符号位(即最高位)到左侧实现的。例如,将4位二进制数4'b0101(即5)符号扩展到8位,结果为8'b00000101(仍为5);而将4'b1101(即-3)符号扩展到8位,则得到8'b11111101(仍为-3)。
构建一个电路,该电路能将一个8位数值符号扩展到32位。这要求先进行24次符号位(即位[7])的复制,随后连接上原来的8位数值本身。
模块声明
module top_module (
input [7:0] in,
output [31:0] out );